package com.suep.data_analysis.service;

import com.suep.data_analysis.dto.UserConfigDetailDto;
import com.suep.data_analysis.dto.CharacterStatsDto;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * 角色属性计算服务
 */
@Service
@AllArgsConstructor
public class CharacterStatsCalculationService {
    
    private final AttributeCalculator attributeCalculator;
    
    /**
     * 计算角色最终属性面板
     */
    public CharacterStatsDto calculateFinalStats(UserConfigDetailDto userConfig) {
        CharacterStatsDto finalStats = new CharacterStatsDto();
        
        // 计算各项最终属性
        finalStats.setFinalHp(calculateHp(userConfig));
        finalStats.setFinalAtk(calculateAtk(userConfig));
        finalStats.setFinalDef(calculateDef(userConfig));
        finalStats.setFinalImpact(calculateImpact(userConfig));
        finalStats.setFinalCritRate(calculateCritRate(userConfig));
        finalStats.setFinalCritDmg(calculateCritDmg(userConfig));
        finalStats.setFinalPenetration(calculatePenetration(userConfig));
        finalStats.setFinalMastery(calculateMastery(userConfig));
        finalStats.setFinalControl(calculateControl(userConfig));
        finalStats.setFinalEnergyRegen(calculateEnergyRegen(userConfig));
        
        // 属性伤害加成
        finalStats.setPhysicalBonus(getAttributeBonus(userConfig, "物理"));
        finalStats.setEtherBonus(getAttributeBonus(userConfig, "以太"));
        finalStats.setFireBonus(getAttributeBonus(userConfig, "火属性"));
        finalStats.setIceBonus(getAttributeBonus(userConfig, "冰属性"));
        finalStats.setElectricBonus(getAttributeBonus(userConfig, "电属性"));
        
        return finalStats;
    }
    
    /**
     * 计算生命值
     */
    private double calculateHp(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.HP, userConfig.getBaseHp());
    }
    
    /**
     * 计算攻击力
     */
    private double calculateAtk(UserConfigDetailDto userConfig) {
        double baseValue = userConfig.getBaseAtk();
        double armamentBaseAtk = userConfig.getArmamentBaseAtk() != null ? userConfig.getArmamentBaseAtk() : 0;
        
        // 基础攻击力 + 音擎基础攻击力
        double totalBaseAtk = baseValue + armamentBaseAtk;
        
        // 使用通用计算器计算攻击力
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.ATK, totalBaseAtk);
    }
    
    /**
     * 计算防御力
     */
    private double calculateDef(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.DEF, userConfig.getBaseDef());
    }
    
    /**
     * 计算冲击力（特殊规则）
     */
    private double calculateImpact(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.IMPACT, userConfig.getBaseImpact());
    }
    
    /**
     * 计算暴击率
     */
    private double calculateCritRate(UserConfigDetailDto userConfig) {
        double critRate = attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.CRIT_RATE, userConfig.getCritRate());
        return Math.round(critRate * 10000.0) / 100.0; // 转换为百分比显示
    }
    
    /**
     * 计算暴击伤害
     */
    private double calculateCritDmg(UserConfigDetailDto userConfig) {
        double critDmg = attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.CRIT_DMG, userConfig.getCritDmg());
        return Math.round(critDmg * 10000.0) / 100.0; // 转换为百分比显示
    }
    
    /**
     * 计算穿透率（特殊规则）
     */
    private double calculatePenetration(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.PENETRATION, userConfig.getPenetration());
    }
    
    /**
     * 计算异常精通
     */
    private double calculateMastery(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.MASTERY, userConfig.getMastery());
    }
    
    /**
     * 计算异常掌控（特殊规则）
     */
    private double calculateControl(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.CONTROL, userConfig.getBaseControl());
    }
    
    /**
     * 计算能量回复（特殊规则）
     */
    private double calculateEnergyRegen(UserConfigDetailDto userConfig) {
        return attributeCalculator.calculateAttribute(userConfig, AttributeCalculator.AttributeType.ENERGY_REGEN, userConfig.getBaseEnergyRegen());
    }
    
    /**
     * 获取属性伤害加成
     */
    private double getAttributeBonus(UserConfigDetailDto userConfig, String attributeName) {
        double bonus = 0;
        
        // 5号位主属性
        if (userConfig.getDriveMainAttr5() != null) {
            // 尝试不同的键名格式
            String[] possibleKeys = {
                attributeName,
                attributeName + "伤害加成",
                attributeName + "加成",
                attributeName + "伤害"
            };
            
            for (String key : possibleKeys) {
                if (userConfig.getDriveMainAttr5().containsKey(key)) {
                    bonus += ((Number) userConfig.getDriveMainAttr5().get(key)).doubleValue();
                    break;
                }
            }
        }
        
        // 两件套属性
        if (userConfig.getSetBonus() != null) {
            // 尝试不同的键名格式
            String[] possibleKeys = {
                attributeName,
                attributeName + "伤害加成",
                attributeName + "加成",
                attributeName + "伤害"
            };
            
            for (String key : possibleKeys) {
                if (userConfig.getSetBonus().containsKey(key)) {
                    bonus += ((Number) userConfig.getSetBonus().get(key)).doubleValue();
                    break;
                }
            }
        }
        
        return bonus;
    }
} 